
 #ifndef _USB_PROTOCOL_HID_H_
 #define _USB_PROTOCOL_HID_H_




 #define  HID_CLASS                            0x03




 #define  HID_SUB_CLASS_NOBOOT                 0x00

 #define  HID_SUB_CLASS_BOOT                   0x01




 #define  HID_PROTOCOL_GENERIC                 0x00

 #define  HID_PROTOCOL_KEYBOARD                0x01

 #define  HID_PROTOCOL_MOUSE                   0x02



 enum usb_reqid_hid {
     USB_REQ_HID_GET_REPORT = 0x01,
     USB_REQ_HID_GET_IDLE = 0x02,
     USB_REQ_HID_GET_PROTOCOL = 0x03,
     USB_REQ_HID_SET_REPORT = 0x09,
     USB_REQ_HID_SET_IDLE = 0x0A,
     USB_REQ_HID_SET_PROTOCOL = 0x0B,
 };

 enum usb_descriptor_type_hid {
     USB_DT_HID = 0x21,
     USB_DT_HID_REPORT = 0x22,
     USB_DT_HID_PHYSICAL = 0x23,
 };

 enum usb_hid_item_report_type {
     USB_HID_ITEM_REPORT_TYPE_MAIN = 0,
     USB_HID_ITEM_REPORT_TYPE_GLOBAL = 1,
     USB_HID_ITEM_REPORT_TYPE_LOCAL = 2,
     USB_HID_ITEM_REPORT_TYPE_LONG = 3,
 };

 enum usb_hid_report_type {
     USB_HID_REPORT_TYPE_INPUT = 1,
     USB_HID_REPORT_TYPE_OUTPUT = 2,
     USB_HID_REPORT_TYPE_FEATURE = 3,
 };


 enum usb_hid_protocol {
     USB_HID_PROCOTOL_BOOT = 0,
     USB_HID_PROCOTOL_REPORT = 1,
 };

 COMPILER_PACK_SET(1);

 typedef struct {
     uint8_t bLength;         
     uint8_t bDescriptorType; 
     le16_t bcdHID;           
     uint8_t bCountryCode;    
     uint8_t bNumDescriptors; 
     uint8_t bRDescriptorType;
     le16_t wDescriptorLength;
 } usb_hid_descriptor_t;

 COMPILER_PACK_RESET();

 #define  REPORT_TYPE_INPUT                    0x01
 #define  REPORT_TYPE_OUTPUT                   0x02
 #define  REPORT_TYPE_FEATURE                  0x03


 #define  USB_HID_BDC_V1_11                    0x0111


 #define  USB_HID_NUM_DESC                     0x01

 #define  USB_HID_NO_COUNTRY_CODE            0   // Not Supported
 #define  USB_HID_COUNTRY_ARABIC             1   // Arabic
 #define  USB_HID_COUNTRY_BELGIAN            2   // Belgian
 #define  USB_HID_COUNTRY_CANADIAN_BILINGUAL 3   // Canadian-Bilingual
 #define  USB_HID_COUNTRY_CANADIAN_FRENCH    4   // Canadian-French
 #define  USB_HID_COUNTRY_CZECH_REPUBLIC     5   // Czech Republic
 #define  USB_HID_COUNTRY_DANISH             6   // Danish
 #define  USB_HID_COUNTRY_FINNISH            7   // Finnish
 #define  USB_HID_COUNTRY_FRENCH             8   // French
 #define  USB_HID_COUNTRY_GERMAN             9   // German
 #define  USB_HID_COUNTRY_GREEK              10  // Greek
 #define  USB_HID_COUNTRY_HEBREW             11  // Hebrew
 #define  USB_HID_COUNTRY_HUNGARY            12  // Hungary
 #define  USB_HID_COUNTRY_INTERNATIONAL_ISO  13  // International (ISO)
 #define  USB_HID_COUNTRY_ITALIAN            14  // Italian
 #define  USB_HID_COUNTRY_JAPAN_KATAKANA     15  // Japan (Katakana)
 #define  USB_HID_COUNTRY_KOREAN             16  // Korean
 #define  USB_HID_COUNTRY_LATIN_AMERICAN     17  // Latin American
 #define  USB_HID_COUNTRY_NETHERLANDS_DUTCH  18  // Netherlands/Dutch
 #define  USB_HID_COUNTRY_NORWEGIAN          19  // Norwegian
 #define  USB_HID_COUNTRY_PERSIAN_FARSI      20  // Persian (Farsi)
 #define  USB_HID_COUNTRY_POLAND             21  // Poland
 #define  USB_HID_COUNTRY_PORTUGUESE         22  // Portuguese
 #define  USB_HID_COUNTRY_RUSSIA             23  // Russia
 #define  USB_HID_COUNTRY_SLOVAKIA           24  // Slovakia
 #define  USB_HID_COUNTRY_SPANISH            25  // Spanish
 #define  USB_HID_COUNTRY_SWEDISH            26  // Swedish
 #define  USB_HID_COUNTRY_SWISS_FRENCH       27  // Swiss/French
 #define  USB_HID_COUNTRY_SWISS_GERMAN       28  // Swiss/German
 #define  USB_HID_COUNTRY_SWITZERLAND        29  // Switzerland
 #define  USB_HID_COUNTRY_TAIWAN             30  // Taiwan
 #define  USB_HID_COUNTRY_TURKISH_Q          31  // Turkish-Q
 #define  USB_HID_COUNTRY_UK                 32  // UK
 #define  USB_HID_COUNTRY_US                 33  // US
 #define  USB_HID_COUNTRY_YUGOSLAVIA         34  // Yugoslavia
 #define  USB_HID_COUNTRY_TURKISH_F          35  // Turkish-F





 #define  HID_A                0x04
 #define  HID_B                0x05
 #define  HID_C                0x06
 #define  HID_D                0x07
 #define  HID_E                0x08
 #define  HID_F                0x09
 #define  HID_G                0x0A
 #define  HID_H                0x0B
 #define  HID_I                0x0C
 #define  HID_J                0x0D
 #define  HID_K                0x0E
 #define  HID_L                0x0F
 #define  HID_M                0x10
 #define  HID_N                0x11
 #define  HID_O                0x12
 #define  HID_P                0x13
 #define  HID_Q                0x14
 #define  HID_R                0x15
 #define  HID_S                0x16
 #define  HID_T                0x17
 #define  HID_U                0x18
 #define  HID_V                0x19
 #define  HID_W                0x1A
 #define  HID_X                0x1B
 #define  HID_Y                0x1C
 #define  HID_Z                0x1D
 #define  HID_1                30
 #define  HID_2                31
 #define  HID_3                32
 #define  HID_4                33
 #define  HID_5                34
 #define  HID_6                35
 #define  HID_7                36
 #define  HID_8                37
 #define  HID_9                38
 #define  HID_0                39
 #define  HID_ENTER            40
 #define  HID_ESCAPE           41
 #define  HID_BACKSPACE        42
 #define  HID_TAB              43
 #define  HID_SPACEBAR         44
 #define  HID_UNDERSCORE       45
 #define  HID_PLUS             46
 #define  HID_OPEN_BRACKET     47 // {
 #define  HID_CLOSE_BRACKET    48 // }
 #define  HID_BACKSLASH        49
 #define  HID_ASH              50 // # ~
 #define  HID_COLON            51 // ; :
 #define  HID_QUOTE            52 // ' "
 #define  HID_TILDE            53
 #define  HID_COMMA            54
 #define  HID_DOT              55
 #define  HID_SLASH            56
 #define  HID_CAPS_LOCK        57
 #define  HID_F1               58
 #define  HID_F2               59
 #define  HID_F3               60
 #define  HID_F4               61
 #define  HID_F5               62
 #define  HID_F6               63
 #define  HID_F7               64
 #define  HID_F8               65
 #define  HID_F9               66
 #define  HID_F10              67
 #define  HID_F11              68
 #define  HID_F12              69
 #define  HID_PRINTSCREEN      70
 #define  HID_SCROLL_LOCK      71
 #define  HID_PAUSE            72
 #define  HID_INSERT           73
 #define  HID_HOME             74
 #define  HID_PAGEUP           75
 #define  HID_DELETE           76
 #define  HID_END              77
 #define  HID_PAGEDOWN         78
 #define  HID_RIGHT            79
 #define  HID_LEFT             80
 #define  HID_DOWN             81
 #define  HID_UP               82
 #define  HID_KEYPAD_NUM_LOCK  83
 #define  HID_KEYPAD_DIVIDE    84
 #define  HID_KEYPAD_AT        85
 #define  HID_KEYPAD_MULTIPLY  85
 #define  HID_KEYPAD_MINUS     86
 #define  HID_KEYPAD_PLUS      87
 #define  HID_KEYPAD_ENTER     88
 #define  HID_KEYPAD_1         89
 #define  HID_KEYPAD_2         90
 #define  HID_KEYPAD_3         91
 #define  HID_KEYPAD_4         92
 #define  HID_KEYPAD_5         93
 #define  HID_KEYPAD_6         94
 #define  HID_KEYPAD_7         95
 #define  HID_KEYPAD_8         96
 #define  HID_KEYPAD_9         97
 #define  HID_KEYPAD_0         98

 #define  HID_MODIFIER_NONE          0x00
 #define  HID_MODIFIER_LEFT_CTRL     0x01
 #define  HID_MODIFIER_LEFT_SHIFT    0x02
 #define  HID_MODIFIER_LEFT_ALT      0x04
 #define  HID_MODIFIER_LEFT_UI       0x08
 #define  HID_MODIFIER_RIGHT_CTRL    0x10
 #define  HID_MODIFIER_RIGHT_SHIFT   0x20
 #define  HID_MODIFIER_RIGHT_ALT     0x40
 #define  HID_MODIFIER_RIGHT_UI      0x80



 #define  HID_LED_NUM_LOCK           (1<<0)
 #define  HID_LED_CAPS_LOCK          (1<<1)
 #define  HID_LED_SCROLL_LOCK        (1<<2)
 #define  HID_LED_COMPOSE            (1<<3)
 #define  HID_LED_KANA               (1<<4)


 #endif // _USB_PROTOCOL_HID_H_
